package com.youi.third.wechat.util;

import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class AESUtil {

	  public static boolean initialized = false;

	    /**
	     * AES解密
	     * 
	     * @param content
	     *            密文
	     * @return
	     * @throws InvalidAlgorithmParameterException
	     * @throws NoSuchProviderException
	     */
	    public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
	        initialize();
	        try {
	            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
	            Key sKeySpec = new SecretKeySpec(keyByte, "AES");
	            cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
	            byte[] result = cipher.doFinal(content);
	            return result;
	        } catch (NoSuchAlgorithmException e) {
	            e.printStackTrace();
	        } catch (NoSuchPaddingException e) {
	            e.printStackTrace();
	        } catch (InvalidKeyException e) {
	            e.printStackTrace();
	        } catch (IllegalBlockSizeException e) {
	            e.printStackTrace();
	        } catch (BadPaddingException e) {
	            e.printStackTrace();
	        } catch (NoSuchProviderException e) {
	            // TODO Auto-generated catch block
	            e.printStackTrace();
	        } catch (Exception e) {
	            // TODO Auto-generated catch block
	            e.printStackTrace();
	        }
	        return null;
	    }

	    public static void initialize() {
	        if (initialized)
	            return;
	        Security.addProvider(new BouncyCastleProvider());
	        initialized = true;
	    }

	    // 生成iv
	    public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
	        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
	        params.init(new IvParameterSpec(iv));
	        return params;
	    }

}
